package pt.chambino.p.pulse.view;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.animation.AccelerateInterpolator;
import android.widget.TextView;
public class BpmView extends TextView {
public BpmView(Context context) {
super(context);
init();
}
public BpmView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BpmView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private double bpm;
private Paint circlePaint;
private ValueAnimator circlePaintAnimator;
private void init() {
setNoBpm();
setTextSize(TypedValue.COMPLEX_UNIT_FRACTION_PARENT, 60f);
setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/ds_digital/DS-DIGIB.TTF"));
setGravity(Gravity.CENTER);
circlePaint = initCirclePaint();
circlePaintAnimator = ObjectAnimator.ofInt(circlePaint, "Alpha", 0, 256);
circlePaintAnimator.setInterpolator(new AccelerateInterpolator());
circlePaintAnimator.setDuration(1000);
circlePaintAnimator.setRepeatCount(ValueAnimator.INFINITE);
circlePaintAnimator.setRepeatMode(ValueAnimator.REVERSE);
circlePaintAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationRepeat(Animator animation) {
if (getText() == "-" && circlePaint.getAlpha() == 0) {
animation.cancel();
}
}
});
circlePaintAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
invalidate();
}
});
}
private Paint initCirclePaint() {
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(Color.RED);
p.setAlpha(0);
p.setStyle(Paint.Style.FILL);
return p;
}
public double getBpm() {
return bpm;
}
public void setBpm(double bpm) {
this.bpm = bpm;
long rounded = Math.round(bpm);
if (rounded == 0) {
setText("-");
} else {
setText(String.valueOf(rounded));
}
}
public void setNoBpm() {
setBpm(0);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(20, getHeight() / 2f, 10, circlePaint);
if (getText() != "-" && !circlePaintAnimator.isStarted()) {
circlePaintAnimator.start();
}
}
}